﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Capa_Dominio;
using Capa_Persistencia_NH.Interface;

namespace Capa_Negocio.Gestionar_SalaEnsayo
{
    public class AdministracionSalaEnsayoImpl: IAdministracionSalaEnsayo
    {
        #region Dependencias
        ILocal localDAO = null;
        ISalaEnsayo SalaEnsayoDAO = null;
        IDistrito distritoDAO = null;
        IServicios serviciosDAO = null;
        IServiciosAdicionales serviciosAdicionalesDAO = null;
        #endregion

        #region Operaciones de negocio
        public SalaEnsayo InscribirSala(string nombre, int localCodigo,
            int capacidad, string caracteristicas, Boolean disponibilidad,string comentarios,Boolean estado)
        {
            // Excepción si falta algún dato requerido
            if (nombre == null || localCodigo == 0 ||
                capacidad == 0 || caracteristicas == null)
                throw new DatosInsuficientesException("Faltan datos para crear la sala");
            // Excepción si ya se registró la misma sala (por nombre y código de local)
            Local localExistente = localDAO.Obtener(localCodigo);
            ICollection<SalaEnsayo> salasEncontradas = SalaEnsayoDAO.ListarXNombre(nombre);
            if (salasEncontradas.Count > 0)
                throw new EntidadRepetidaException("La sala ya existe");
            // Creación de la sala
            SalaEnsayo salaACrear = new SalaEnsayo();
            salaACrear.NombreSala = nombre;
            salaACrear.Local = localExistente;
            salaACrear.Capacidad = capacidad;
            salaACrear.Caracteristicas = caracteristicas;
            salaACrear.Disponibilidad = disponibilidad;
            salaACrear.Comentarios = comentarios;
            salaACrear.Estado = true;//por defecto todos los entidades se creando con estado activo = True
            return SalaEnsayoDAO.Crear(salaACrear);
        }

        public ServiciosAdicionales RegistrarServiciosAdicionales(int servicioCodigo, int salacodigo, string observacion, Boolean estado)
        {
            ServiciosAdicionales objServiciosAdicionales;
            // Excepción si falta algún dato requerido
            if (servicioCodigo == 0 || salacodigo == 0 ||
                observacion == null)
                throw new DatosInsuficientesException("Faltan datos para crear el servicio adicional");

            Servicios objServicio = serviciosDAO.Obtener(servicioCodigo);
            SalaEnsayo objSalaEnsayo = SalaEnsayoDAO.Obtener(servicioCodigo);


            objServiciosAdicionales = new ServiciosAdicionales();

            objServiciosAdicionales.SalaEnsayo = objSalaEnsayo;
            objServiciosAdicionales.Servicios = objServicio;
            objServiciosAdicionales.Observacion = observacion;
            objServiciosAdicionales.Estado = true;

            return serviciosAdicionalesDAO.Crear(objServiciosAdicionales);

        }
        #endregion

        #region Metodos de soporte para la entidad Distrito
        public Distrito CrearDistrito(Distrito entidadDistrito)
        {
            ICollection<Distrito> existente = distritoDAO.ListarXNombre(entidadDistrito.NombreDistrito);
            if (existente.Count>0)
            {
                throw new EntidadRepetidaException("Distrito ya existente");
            }
            return distritoDAO.Crear(entidadDistrito);
        }
        public ICollection<Distrito> listarDistritos()
        {
            return distritoDAO.ListarTodos();
        }
        #endregion

        #region Métodos de soporte para entidad Local
        public Local CrearLocal(string nombreLocal, int codigoDistrito, string direccion, Boolean estado)
        {
            ICollection<Local> existentes = localDAO.ListarXNombre(nombreLocal);
            Distrito distritoEncontrado = distritoDAO.Obtener(codigoDistrito);
            if(distritoEncontrado == null)
                throw new DatosInsuficientesException("Distrito no existente");

            if (existentes.Count > 0)
                throw new EntidadRepetidaException("Local ya existente");

            Local localACrear = new Local() { NombreLocal=nombreLocal, Direccion=direccion, Distrito=distritoEncontrado, Estado=true };

            return localDAO.Crear(localACrear);
        }
        public Local ObtenerLocal(int codigo)
        {
            return localDAO.Obtener(codigo);
        }
        public Local ModificarLocal(Local localAModificar)
        {
            return localDAO.Modificar(localAModificar);
        }
        public void EliminarLocal(Local localAEliminar)
        {
            localDAO.Eliminar(localAEliminar);
        }
        public ICollection<Local> ListarLocales()
        {
            return localDAO.ListarTodos();
        }
        public ICollection<Local> ListarLocalesXNombre(string nombre)
        {
            return localDAO.ListarXNombre(nombre);
        }
        #endregion

        #region Métodos de soporte para entidad servicios
        public Servicios CrearServicios(Servicios serviciosACrear)
        {
            ICollection<Servicios> existentes = serviciosDAO.ListarXNombre(serviciosACrear.NombreServicio);
            if (existentes.Count > 0)
                throw new EntidadRepetidaException("Servicio ya existente");
            return serviciosDAO.Crear(serviciosACrear);
        }
        public Servicios ObtenerServicios(int codigo)
        {
            return serviciosDAO.Obtener(codigo);
        }
        public Servicios ModificarServicios(Servicios serviciosAModificar)
        {
            return serviciosDAO.Modificar(serviciosAModificar);
        }
        public void EliminarServicios(Servicios serviciosAEliminar)
        {
            serviciosDAO.Eliminar(serviciosAEliminar);
        }
        public ICollection<Servicios> ListarServicios()
        {
            return serviciosDAO.ListarTodos();
        }
        public ICollection<Servicios> ListarServiciosXNombre(string nombre)
        {
            return serviciosDAO.ListarXNombre(nombre);
        }
        #endregion

        #region Métodos de soporte para entidad Sala

        public SalaEnsayo ModificarSala(SalaEnsayo salaUpdate)
        {
            return SalaEnsayoDAO.Modificar(salaUpdate);
        }

        public SalaEnsayo ObtenerSala(int Codigo)
        {
            return SalaEnsayoDAO.Obtener(Codigo);
        }
        public ICollection<SalaEnsayo> ListarSalas(string nombre, int? localCodigo, int? capacidad, string caracteristicas)
        {
            Local localExistente = null;
            if (localCodigo != null && localCodigo != 0)
                localExistente = localDAO.Obtener(localCodigo.Value);
            return SalaEnsayoDAO.ListarXBusqueda(
                null, nombre, caracteristicas, capacidad, localExistente, null);
        }
        #endregion
    }
}
